package com.nnnu.wsnackshop.controller.user;

import com.nnnu.wsnackshop.constant.MessageConstants;
import com.nnnu.wsnackshop.constant.StatusCodeConstants;
import com.nnnu.wsnackshop.pojo.dto.SkuPageDTO;
import com.nnnu.wsnackshop.pojo.vo.SkuVO;
import com.nnnu.wsnackshop.result.PageResult;
import com.nnnu.wsnackshop.result.Result;
import com.nnnu.wsnackshop.service.IProductSkuService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
import java.util.List;

/**
 * <p>
 * 商品SKU表 前端控制器
 * </p>
 *
 * @author zk
 * @since 2025-05-14
 */
@RestController("userProductSkuController")
@RequestMapping("/api/user/sku")
@Tag(name = "用户端-SKU接口")
@Slf4j
@RequiredArgsConstructor
public class ProductSkuController {

    private final IProductSkuService skuService;

    /**
     * 查询某 SPU 下所有可售且有效的 SKU 列表（不分页或可分页）
     * GET /api/user/sku/by-spu/{spuId}
     */
    @Operation(summary = "查询某 SPU 下所有可售且有效的 SKU", description = "返回指定 SPU 下 saleable=true 且 valid=true 的 SKU 列表")
    @GetMapping("/by-spu/{spuId}")
    @Cacheable(cacheNames = "userSkuBySpu", key = "'spu:' + #spuId")
    public Result<List<SkuVO>> listSkuBySpu(@PathVariable("spuId") Integer spuId) {
        log.info("[用户端] 查询 SPU 下 SKU 列表: spuId={}", spuId);
        // 调用 service 获取列表
        List<SkuVO> list = skuService.listSkuBySpu(spuId);
        return Result.success(list, MessageConstants.SELECT_OK);
    }

    /**
     * 查询某商品下所有可售且有效的 SKU 列表
     * GET /api/user/sku/by-product/{productId}
     */
    @Operation(summary = "查询某商品下所有可售且有效的 SKU", description = "返回指定商品下 saleable=true 且 valid=true 的 SKU 列表")
    @GetMapping("/by-product/{productId}")
    @Cacheable(cacheNames = "userSkuByProduct", key = "'product:' + #productId")
    public Result<List<SkuVO>> listSkuByProduct(@PathVariable("productId") Integer productId) {
        log.info("[用户端] 查询商品下 SKU 列表: productId={}", productId);
        // 调用 service 获取列表
        List<SkuVO> list = skuService.listSkuByProduct(productId);
        return Result.success(list, MessageConstants.SELECT_OK);
    }

    /**
     * （可选）分页查询某 SPU 下的 SKU，若 SKU 数量很多，可分页
     * GET /api/user/sku/page?spuId=xx&pageNum=1&pageSize=10
     */
    @Operation(summary = "分页查询某 SPU 下的 SKU", description = "分页返回指定 SPU 下 saleable=true 且 valid=true 的 SKU 列表")
    @GetMapping("/page")
    @Cacheable(cacheNames = "userSkuPage", key = "'spu:' + #dto.getSpuId() + ':page:' + #dto.getPageNum() + ':' + #dto.getPageSize()")
    public Result<PageResult<SkuVO>> pageSkuBySpu(@ParameterObject SkuPageDTO dto) {
        log.info("[用户端] 分页查询 SPU 下 SKU: dto={}", dto);
        // 强制筛选 saleable=true、valid=true
        dto.setSaleable(true);
        // dto 中可能有其他字段，如 title 关键词搜索
        PageResult<SkuVO> page = skuService.pageSku(dto);
        return Result.success(page, MessageConstants.SELECT_OK);
    }

    /**
     * 获取单个 SKU 详情（用户端）
     * GET /api/user/sku/{id}
     */
    @Operation(summary = "获取 SKU 详情（用户端）", description = "返回指定 SKU 详情，若不满足 saleable 或 valid，可返回 404 或特殊处理")
    @GetMapping("/{id}")
    @Cacheable(cacheNames = "userSkuDetail", key = "'sku:' + #id")
    public Result<SkuVO> getSkuDetail(@PathVariable("id") Integer id) {
        log.info("[用户端] 获取 SKU 详情: id={}", id);
        SkuVO vo = skuService.getSkuDetail(id);
        // 可选：校验 saleable & valid
        if (vo == null) {
            return Result.error(StatusCodeConstants.NOT_FOUND, "SKU 不存在");
        }
        if (!Boolean.TRUE.equals(vo.getSaleable()) || !Boolean.TRUE.equals(vo.getValid())) {
            return Result.error(StatusCodeConstants.FORBIDDEN, "SKU 不可用");
        }
        return Result.success(vo, MessageConstants.SELECT_OK);
    }
}
